package com.caioweb.osa.dao;

import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder.In;

import com.caioweb.osa.mb.AmbienteBean;
import com.caioweb.osa.modelo.Historico;
import com.caioweb.osa.transacoes.interceptor.Transactional;
import com.sun.faces.util.Cache.Factory;
import com.uaihebert.factory.EasyCriteriaFactory;
import com.uaihebert.model.EasyCriteria;

public class HistoricoDAO implements Serializable{
	@Inject
	private EntityManager em;
	
	@Inject
	private DAO<Historico> dao;
	// perquisa hsitorico por filros, tipo(interno,externo),data (final,inicial) e por cliente

	public List<Historico> pesquisa(String tipoAmbiente,Date dataInicial,Date dataFinal,Integer idCliente,Long idTpAmbienteCliente){
		EasyCriteria<Historico> criteria = EasyCriteriaFactory.createQueryCriteria(em, Historico.class);
		if(tipoAmbiente != null && !tipoAmbiente.isEmpty()){
		criteria.innerJoin("ambiente");
			criteria.andJoinEquals("ambiente", "tpAmbiente", tipoAmbiente);
		}
		if(idCliente != null && !idCliente.equals(new Integer(0))){
			criteria.innerJoin("ambiente");
			criteria.andJoinEquals("ambiente", "cliente", idCliente);
		}
		if(idTpAmbienteCliente != null && !idTpAmbienteCliente.equals(new Long(0))){
			criteria.innerJoin("ambiente");
			criteria.andJoinEquals("ambiente", "tipoAmbienteCliente", idTpAmbienteCliente);
		}
		
		if(dataFinal != null){
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(dataFinal);
			calendar.add(Calendar.DAY_OF_MONTH,1);
			dataFinal = calendar.getTime();
			criteria.andLessOrEqualTo("data", dataFinal);
			
		}
		if(dataInicial != null){

			criteria.andGreaterOrEqualTo("data", dataInicial);
			
		}
		return criteria.getResultList();
	}
	//retorna o numero de linhas da consulta do metodo pesquisa(..) ,resultado utilizado pelo data table
	public Integer contaPesquisa(String tipoAmbiente,Date dataInicial,Date dataFinal,Integer idCliente,Long idTpAmbienteCliente){
		List<Historico> lista = pesquisa(tipoAmbiente,dataInicial,dataFinal,idCliente,idTpAmbienteCliente);
		return lista.size();
	}
	
	public Integer buscaRevisaoBaseRestaurada(Long idCliente,Long tpAmbienteCliente){
		StringBuilder sb = new StringBuilder();
		sb.append(" select max(h.revisaoFinal) from Historico h ");
		sb.append(" join h.ambiente a ");
		sb.append(" join a.cliente c" ); 
		sb.append(" join a.tipoAmbienteCliente ac " ); 
		sb.append(" where c.id = "+ idCliente+" and a.tpAmbiente = '"+AmbienteBean.EXTERNO+"'");
		sb.append(" and ac.id = "+ tpAmbienteCliente);
		
		TypedQuery<Integer> query = em.createQuery(sb.toString(),Integer.class);
	    try {
	    	return query.getSingleResult();
		} catch (Exception e) {
			return null;
		}
	}
	public void adiciona(Historico t) {
		dao.adiciona(t);
	}
	public void atualiza(Historico t) {
		dao.atualiza(t);
	}
	public List<Historico> listaTodos() {
		return dao.listaTodos();
	}
	public Historico buscaPorId(Long id) {
		return dao.buscaPorId(id);
	}
	public int contaTodos() {
		return dao.contaTodos();
	}
	
	


	
	

}
